/*
 * Nave.cpp
 *
 *  Created on: 09/01/2010
 *      Author: San Martín, Matías I.
 */

#include "Nave.h"

namespace aplicacion {

Nave::Nave( const Posicion& posPartida )
	: _posicion(posPartida) {
	this->setTamanio(_posicion.getTamanio());
}
Nave::Nave() {
	this->setTamanio(_posicion.getTamanio());
}

Nave::~Nave() {
}

std::ostream &operator<<( std::ostream &stream, const Nave &obj )
{
  return stream << "Nave: " << obj._posicion;
}

bool Nave::operator == (const Nave& otro) const
{
	return _posicion == otro._posicion;
}

bool Nave::operator != (const Nave& otro) const
{
	return !(*this == otro);
}

T_TIEMPO Nave::getTiempoArribo(const Posicion& destino) const
{
	return (_posicion.getDistancia(destino) / _velocidad) + 0.5 /*redondeo*/;
}

bool Nave::moverADestino(const Posicion& destino, T_TIEMPO pasado)
{
	//calculo cuanto se desplazo (en modulo)
	T_DISTANCIA movido = pasado * _velocidad;

	if (movido >= _posicion.getDistancia(destino))
	{
		//se llego a destino
		_posicion = destino;
		return true;
	}

	//calculo el vector desplazamiento
	Posicion desplazamiento = _posicion.getDireccion(destino,movido);

	//hago el desplazamiento
	_posicion += desplazamiento;
	return false;
}

size_t Nave::save (int fd) const
{
	size_t guardar = 0;

	guardar += _posicion.save(fd);

	return guardar;
}

size_t Nave::load (int fd)
{
	size_t cargar = 0;

	cargar += _posicion.load(fd);

	this->setTamanio(cargar);
	return cargar;
}

/**
 * @see middleware::io::SerializableToArray#saveToArray(int)
 */
size_t Nave::saveToArray (uint8_t* arr) const {
	size_t guardar = 0;

	guardar += _posicion.saveToArray(arr);

	return guardar;
}

/**
 * @see middleware::io::SerializableToArray#loadFromArray(int)
 */
size_t Nave::loadFromArray (const uint8_t* arr) {
	size_t cargar = 0;

	cargar += _posicion.loadFromArray(arr);

	this->setTamanio(cargar);
	return cargar;
}

} //namespace aplicacion
